import java.util.List;
import java.util.ArrayList;


import gps.api.GPSProblem;
import gps.api.GPSRule;
import gps.api.GPSState;


public class Problem implements GPSProblem {

  State goal = null;

  @Override
  public GPSState getGoalState() {
    
    if(goal == null){
      ArrayList<Integer> t = new ArrayList<Integer>(9);
      t.add(0,0);
      t.add(1, 2);
      t.add(2, 4);
      t.add(3,6);
      t.add(4, 8);
      t.add(5, 3);
      t.add(6, 1);
      t.add(7, 7);
      t.add(8, 5);
      
      goal = new State(t);
    }

    return goal;
  }

  @Override
  public Integer getHValue(GPSState arg0) {
    int resp=0;
    for(int i=1; i<9; i++){
      resp = resp + 8-Math.abs(((State)arg0).tablero.get(i)-goal.tablero.get(i));
    }
    
    return resp;
  }

  @Override
  public GPSState getInitState() {
    return new State();
  }

  @Override
  public List<GPSRule> getRules() {
    List<GPSRule> resp = new ArrayList<GPSRule>();
    
    for(int i=1; i<9; i++){
      for(int j=1; j<9; j++){
        resp.add(new Rule(j,i));
      }
    }
    return resp;
  }

}
